package chapter06.s02set.p01hashset.e09;

import java.util.HashSet;

/**
 * 重写 hashCode()和 equals() 方法
 * <p>
 * hashCode()方法中返回id属性的哈希值，
 * equals()方法中比较对象的id属性是否相等，并返回结果。
 * <p>
 * 当调用HashSet集合的add()方法添加stu3对象时，发现它的哈希值与stu2对象相同，而且stu2.equals(stu3)返回true，
 * HashSet集合认为两个对象相同，因此重复的Student对象被成功去除了
 */
class Student {
    private String id;
    private String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // 重写toString()方法
    public String toString() {
        return id + ":" + name;
    }

    // 重写hashCode方法
    public int hashCode() {
        return id.hashCode();                     // 返回id属性的哈希值
    }

    // 重写equals方法
    public boolean equals(Object obj) {
        if (this == obj) {                        // 判断是否是同一个对象
            return true;                          // 如果是，直接返回true
        }
        if (!(obj instanceof Student)) {       // 判断对象是为Student类型
            return false;
        }
        Student stu = (Student) obj;            // 将对象强转为Student类型
        boolean b = this.id.equals(stu.id);     // 判断id值是否相同
        return b;                                   // 返回判断结果
    }
}

public class Example09 {
    public static void main(String[] args) {
        HashSet hs = new HashSet();                  // 创建HashSet对象
        Student stu1 = new Student("1", "张三");   // 创建Student对象
        Student stu2 = new Student("2", "李四");
        Student stu3 = new Student("2", "李四");
        hs.add(stu1);                                   // 向集合存入对象
        hs.add(stu2);
        hs.add(stu2);
        hs.add(stu2);
        hs.add(stu3);
        System.out.println(hs);                      // 打印集合中的元素
    }
}
